package com.test.demo.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 日志切面
 *
 * @author zx
 */
@Aspect//声明这是一个切面
@Component
public class MyLogAspect {

    /**
     * 定义切点,使用了@MyLog注解的类 或 使用了@MyLog注解的方法
     */
    @Pointcut("@within(com.test.demo.annotation.MyLog) || @annotation(com.test.demo.annotation.MyLog)")
    public void pointcut() {
    }

    /**
     * 前置通知（Before advice） ：在某连接点（JoinPoint）之前执行的通知，但这个通知不能阻止连接点前的执行。
     * @param joinPoint
     */

    @Before("pointcut()")
    public void doBefore(JoinPoint joinPoint)
    {
        System.out.println("=====SysLogAspect前置通知开始=====");
    }

    /**
     * 后通知（After advice） ：当某连接点退出的时候执行的通知（不论是正常返回还是异常退出）。
     * @param joinPoint
     */

    @AfterReturning(pointcut = "pointcut()")
    public void doAfter(JoinPoint joinPoint)
    {
        System.out.println("=====SysLogAspect后置通知开始=====");

    }

    /**
     * 抛出异常后通知（After throwing advice） ： 在方法抛出异常退出时执行的通知。
     * @param joinPoint
     * @param e
     */


    @AfterThrowing(value = "pointcut()", throwing = "e")
    public void doAfter(JoinPoint joinPoint, Exception e)
    {
        System.out.println("=====SysLogAspect异常通知开始=====");
    }




}
